{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.8\n",
      "[[1], [1], [1], [1]]\n",
      "0\n",
      "1\n",
      "2\n",
      "3\n",
      "4\n",
      "5\n",
      "6\n",
      "7\n",
      "8\n",
      "9\n"
     ]
    }
   ],
   "source": [
    "a,b,c,d = 0.5,0.1,0.3,0.8\n",
    "\n",
    "print(max(a,b,c,d))\n",
    "\n",
    "\n",
    "rewards = [[1] for _ in range(4)]\n",
    "print(rewards)\n",
    "\n",
    "\n",
    "for i in range(10):\n",
    "    print(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "共15次抽到\n"
     ]
    }
   ],
   "source": [
    "# 实现80%的概率\n",
    "import random\n",
    "\n",
    "# 随机生成一个浮点型随机数\n",
    "# 代表抽奖，概率是完全随机的\n",
    "# print(random.random())\n",
    "# random.random() 随机生成0-1之间的随机数\n",
    "\n",
    "\n",
    "n = 0\n",
    "for i in range(100):\n",
    "    may = random.random()\n",
    "\n",
    "    if may < 0.1:\n",
    "        n += 1\n",
    "print(f\"共{n}次抽到\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1: 0.19, 2: 0.1, 3: 0.18, 4: 0.11, 5: 0.2, 6: 0.22\n"
     ]
    }
   ],
   "source": [
    "# 随机掷色子，计算概率\n",
    "\n",
    "roll = [1, 2, 3, 4, 5, 6]\n",
    "\n",
    "def roll_dice():\n",
    "    return random.choice(roll) # 随机选择一个数\n",
    "\n",
    "one = 0\n",
    "two = 0\n",
    "three = 0\n",
    "four = 0\n",
    "five = 0\n",
    "six = 0\n",
    "\n",
    "echo = 100\n",
    "\n",
    "for i in range(echo):\n",
    "    result = roll_dice()\n",
    "    if result == 1:\n",
    "        one += 1\n",
    "    elif result == 2:\n",
    "        two += 1\n",
    "    elif result == 3:\n",
    "        three += 1\n",
    "    elif result == 4:\n",
    "        four += 1\n",
    "    elif result == 5:\n",
    "        five += 1\n",
    "    elif result == 6:\n",
    "        six += 1\n",
    "\n",
    "# / 10000 计算概率\n",
    "result = f\"1: {one / echo}, 2: {two / echo}, 3: {three / echo}, 4: {four / echo}, 5: {five / echo}, 6: {six / echo}\"\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 162,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "1: 0.1690\n",
      "2: 0.1550\n",
      "3: 0.1750\n",
      "4: 0.1580\n",
      "5: 0.1780\n",
      "6: 0.1650\n"
     ]
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "# 色子的六个面\n",
    "roll = [1, 2, 3, 4, 5, 6]\n",
    "\n",
    "def roll_dice():\n",
    "    return random.choice(roll)  # 随机选择一个数\n",
    "\n",
    "# 模拟掷色子的次数\n",
    "echo = 1000\n",
    "\n",
    "# 使用字典记录每个点数出现的次数\n",
    "results = {i: 0 for i in roll}\n",
    "\n",
    "for _ in range(echo):\n",
    "    result = roll_dice()\n",
    "    results[result] += 1\n",
    "\n",
    "# 计算每个点数出现的概率\n",
    "probability = {key: value / echo for key, value in results.items()}\n",
    "\n",
    "# 打印结果\n",
    "for key, value in probability.items():\n",
    "    print(f\"{key}: {value:.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAHHCAYAAACiOWx7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABNVUlEQVR4nO3dCdxU4///8U91t9OujSSifY9kSZRKocUWUUi2ooUQSgtSKYVIXwo/QllCSCmKSnvaSBFRKn2VFtrn/3hfvmf+M/fWmTE1c9/zej4ex93MXHPmnGtmzHuubXIEAoGAAQAAIFM5M78ZAAAAQmgCAADwgdAEAADgA6EJAADAB0ITAACAD4QmAAAAHwhNAAAAPhCaAAAAfCA0AQAA+EBoAhA3/fv3txw5chyTx2rcuLHbPF988YV77LfffvuYPP6NN95op5xyiiWy3bt32y233GKlS5d2ddOjR4+Y7l/71HOe1aV+Lf3000/u3F5++eW4HheOPkITsjX9T0z/M0tve+CBB+J9eNm6rvPly2dly5a15s2b29NPP227du2KyeNs2rTJffAuW7bMEk0iH5sfjz/+uHse77jjDvu///s/u+GGGzIsqwDoPdc5c+a0IkWKWI0aNezWW2+1+fPnW6JQuAl9XebPn99q1qxpI0eOtMOHD8f78JDFpMT7AIBjYeDAgVahQoWw66pXrx6340mGuj5w4IBt3rzZteioxWLEiBH2wQcfuA8sz8MPPxxxeFUwGTBggPvQrl27tu/7TZs2zY62zI7tP//5T8J/SM+cOdPOPvtse+SRR3yV1znec8897t8Kxd9++61NmjTJnWvPnj3dcx7q77//tpSUY/+xc9JJJ9ngwYPdv7dt22YTJkxwx/f777/bY489dsyPB1kXoQlJ4ZJLLrH69ev7Krt3717LkyeP+/aMf1/Xffr0cR/Gl156qV1++eXug1Xf9kUfoEf7Q/Svv/6yAgUKuOc0nnLnzm2JbuvWrVa1alXf5U888US7/vrrw64bMmSIXXfddfbUU0/Z6aef7lqtPGp9jIfChQuHHeftt99ulStXtmeeecaF/Fy5csXluJD18KmApOaNa3nzzTddq4c+BPQBu3PnTne7uhlatGjh/qer6y+44AKbM2dOmv189dVXduaZZ7oPhdNOO81eeOGFNON1Mhv3kN5Yj40bN9rNN99spUqVsrx581q1atVs3Lhx6R7/xIkT3TdmfaPWMTRp0sTWrVuX5nF0Pi1btrSiRYtawYIFXavPqFGj3G3jx493+1q6dGm63Tb6YNExReOiiy6yvn372s8//2yvvfZapmOapk+fbuedd57r7jnuuOOsUqVK9uCDDwbPV/UsN910U7DLxatTdcWoBXHx4sXWqFEj95x59009DsVz6NAhV0bjeFQnCna//PJLWBm1HGlMUmqh+zzSsaU3pmnPnj2upaZcuXLuOda5PvnkkxYIBMLKaT/dunWzyZMnu/PzXg9Tp071HYY6d+7sXkt6fdSqVcteeeWVNK+j9evX20cffRQ8dr1mI6VArK69YsWKuddk6Llk9DrXsakrV+elVkoFrf379wfL7Nixw7VWevVUsWJFF86ibblTHei5UuuY6sZz8OBBGzRokHsP63H0fOm1sW/fvogfQ62seh3oPal9lSlTxlq3bh1VnSJx0NKEpPDnn3+6ZvlQJUqUCP5b/6NUS8S9997r/gepf6t1RK0m9erVc90VanlSsFAA+PLLL+2ss85y912xYoU1a9bMTjjhBPeBoP/xqrw+oKK1ZcsW103ifVhq35988on7cFGgSz1A94knnnDHp+PXuQ4dOtQ6dOgQNrZEYUStPfqfd/fu3V1IUKvPlClT3OUrr7zSunbtaq+//rrVqVMnbP+6TuFAoTJaGh+jDyB1k3Xp0iXdMqtWrXLHqDCnFgB92Cj8eUG1SpUq7vp+/fq5sTPnn3++u/6cc84J7uO///2ve97at2/vWheO9Dzog131fP/997sPUI11adq0qRuX5LWI+eHn2EIpTCigff755+55VVfXp59+ar1793ZBQi01qYP5u+++a3feeacdf/zxbpzYFVdcYRs2bLDixYtneFzqEtNzp3rUa0mhRF1oCnEKI3rudewKOuqy0oe81+Wm1100FHbbtm1rL730kq1evdoFvIy6M/U+0nGoztT6o3PX4Hy1EOp9qL/6sqLrb7vtNjv55JNt7ty5rgXzt99+c89XNLwvMQrnHg2CV5jUe0F1oPePuvX0Pnnvvfci2r+eG72e77rrLhe+9NrSe1DPV6JPCEAmAkA2Nn78eH3NTXeTzz//3P371FNPDfz111/B+x0+fDhw+umnB5o3b+7+7VGZChUqBC6++OLgdW3atAnky5cv8PPPPwevW716dSBX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plWrVtn06dNtypQpLojdeuutwdt37txpzZo1s/Lly9vixYtt2LBh1r9/fxs7dmywzNy5c+3aa691gWvp0qXWpk0bt61cuTLGZwwAALKqlHg++CWXXOK2zGzcuNHuuusu+/TTT61Vq1Zht3377bc2depUW7hwodWvX99d98wzz1jLli3tySefdCHr9ddft/3799u4ceMsT548Vq1aNVu2bJmNGDEiGK5GjRplLVq0sN69e7vLgwYNciHs2WeftTFjxhy18wcAAFlHXEPTkRw+fNhuuOEGF2YUdlKbN2+e65LzApM0bdrUcubMafPnz7e2bdu6Mo0aNXKBydO8eXMbMmSIbd++3YoWLerK9OrVK2zfKpNZd+G+ffvcFtqiJQcPHnRbrOvhn+M/rEew5KHzzePOP5o6pd4ir7fkrTOh3iLHezQ61Fs86i0jkewroUOTgk1KSordfffd6d6+efNmK1myZNh1Kl+sWDF3m1emQoUKYWVKlSoVvE2hSX+960LLePtIz+DBg23AgAFprl+0aJEVLFjQYmnXrl3Wt29fM9tmZvMteewys762bds2F4Ijvjf1FnG9JW+dCfUWOd6j0aHe4lFvmQ0VyvKhSeOP1G22ZMkSNwA80fTp0yesdUotTRpkrlYvDUqPJXUnqsvQbI6Z1bbksUydpTZnzhyrXTvy86beIq+35K0zod4ix3s0OtRbPOotI15PUZYOTV9++aVt3brVTj755OB1hw4dsnvuucfNoPvpp5+sdOnSrkzqZjbNqNNtor9btmwJK+NdPlIZ7/b05M2b122pqaVLWyypu1Hjsv4Zt5+wT9lRoPPd784/mjql3iKvt+StM6HeIsd7NDrUWzzqLSOR7Cth12nSWCYtFaBE7W0a2K3xTRoULg0bNrQdO3a4VinPzJkzXX9ngwYNgmU0o+7AgQPBMhrkXalSJdc155WZMWNG2OOrjK4HAACweEdUrae0bt264OX169e7cKQxSWphKl68eFj53Llzu9YfBR6pUqWKm/XWpUsXN8tNwahbt27Wvn374PIE1113nRt7pOUE7r//freMgLr9nnrqqeB+u3fvbhdccIENHz7czdB788033dik0GUJAABAcotrS5OCSZ06ddwmGiOkf/fr18/3PrSkgBalbNKkiVtq4LzzzgsLO4ULF7Zp06a5QFavXj3Xvaf9h67ldM45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AABkS1H/9lxqp59+uj3xxBNpWqEAAACyg5iFJm9wuH60FwAAILuJakzTBx98EHY5EAjYb7/9Zs8++6yde+65sTo2AACArB2a2rRpE3ZZK4KfcMIJdtFFF7mFLwEAALKblGh/ew4AACCZxHRMEwAAQHYVVUtTr169fJcdMWJENA8BAACQ9UPT0qVL3aZFLStVquSu+/777y1XrlxWt27dsLFOAAAASRuaLrvsMjv++OPtlVdesaJFi7rrtMjlTTfdZOeff77dc889sT5OAACArDemSTPkBg8eHAxMon8/+uijMZ09d+jQIevbt69VqFDB8ufPb6eddpoNGjTILXHg0b/79etnZcqUcWWaNm1qa9euDdvPH3/8YR06dLBChQpZkSJFrHPnzm4V81DLly93gS9fvnxWrlw5Gzp0aMzOAwAAJGlo2rlzp/3+++9prtd1u3btslgZMmSIPf/88279p2+//dZdVph55plngmV0+emnn7YxY8bY/PnzrWDBgta8eXPbu3dvsIwC06pVq2z69Ok2ZcoUmz17tt16661h59OsWTMrX768LV682IYNG2b9+/e3sWPHxuxcAABAEnbPtW3b1nXFqVXprLPOctcpsPTu3dvatWsXs4ObO3eutW7d2lq1auUun3LKKe637RYsWBBsZRo5cqQ9/PDDrpy8+uqrVqpUKZs8ebK1b9/eha2pU6fawoULrX79+q6MQlfLli3tySeftLJly9rrr79u+/fvt3HjxrkfHa5WrZotW7bMDWIPDVcAACB5RRWa1Kpz77332nXXXecGg7sdpaS4bi+10sTKOeec41p7NMj8jDPOsG+++ca++uqr4Iy89evX2+bNm12XnKdw4cLWoEEDmzdvngtN+qsuOS8wicrnzJnTBT0FQJVp1KiRC0wetVapZUtjtUK7IT379u1zW2hrlRw8eNBtsaR1sf45Nq2PFdt9Jzadbx53/tHUKfUWeb0lb50J9RY53qPRod7iUW8ZiWRfUYWmAgUK2HPPPecC0g8//OCu03gjdY3F0gMPPODCSOXKld3MPI1xeuyxx1x3mygwiVqWQumyd5v+lixZMux2BbxixYqFldG4qdT78G5LLzRpTNeAAQPSXL9o0aKY14O6PDW2y2yb2vQseairt69t27bNBdyI7029RVxvyVtnQr1FjvdodKi3eNRbRvbs2XN0Q5NHvzenTa00GoSt7rJYLjMwceJE13U2YcKEYJdZjx49XJdap06dLJ769OkTtl6Vwp0GkKtFSwPOY0nnrQHwZnPMrLYlj2VmNsjmzJljtWtHft7UW+T1lrx1JtRb5HiPRod6i0e9ZcTrKTpqoem///2vXX311fb555+7kKTZaqeeeqrrnlOrTKxm0GmMlFqb1M0mNWrUsJ9//tm18ig0lS5d2l2/ZcsWN3vOo8teharM1q1b0zTFaUadd3/91X1CeZe9MqnlzZvXbampFUtbLKkrUWOu/hm3H9t9Jzad7353/tHUKfUWeb0lb50J9RY53qPRod7iUW8ZiWRfUc2e69mzp+XOnds2bNjguuo811xzjRt0HSt//fWXq5xQ6qbzfvtOXWoKNTNmzAhLjGq2a9iwobusvzt27HCz4jwzZ850+9DYJ6+MZtR547NEM+20cGd6XXMAACD5RBWapk2b5gZJn3TSSWHXn3766a4lKFa0iKbGMH300Uf2008/2XvvvecGgWvwtqiVS911Wh/qgw8+sBUrVljHjh1d912bNm1cmSpVqliLFi2sS5cubtadmvW6devmWq9UTjSgXYPq1FKmpQneeustGzVqVEQ/FwMAALK3lGgHTYW2MHnU5ZVel1W0tDSABrvdeeedrotNIee2225zi1l67rvvPnc8WhpALUrnnXeea+3SIpUejYtSUGrSpIlrubriiivc2k6hM+4UBLt27Wr16tWzEiVKuMdguQEAAPCvQpNWztZ6SP8MRPunxUfdXVpo8sILL7RY0U+1aB0mbRnRYw8cONBtGdFMOQ0mz0zNmjXtyy+//FfHCwAAsq+oQpPCkVptNL1eg9HU2qNuLbU0qfsLAAAgu4lqTFP16tXdgpPqCtNK3Ooe00rgS5cudes1AQAAWLK3NGmGmQZWa1Xwhx566OgcFQAAQFZvadJSA8uXLz86RwMAAJCduueuv/56e+mll2J/NAAAANlpILhW1B43bpx99tlnbop+6t9a835QFwAAIClD048//minnHKKrVy50urWreuu04DwULH87TkAAIAsGZq04rd+oFe/Oef9bIoWiSxVqtTROj4AAICsN6YpEAiEXf7kk0/ccgMAAADZXVQDwTMKUQAAANlVRKFJ45VSj1liDBMAAEgGKZG2LN14443BH+Xdu3ev3X777Wlmz7377ruxPUoAAICs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VNQVl153XLJSF6QW+0zdFYnMUW+Ro86iQ71Fh3qLTt4kr7ccGg0e74MAAABIdCxuCQAA4AOhCQAAwAdCEwAAgA+EJgAAAB8ITUjX7Nmz7bLLLnMrpGqF88mTJ8f7kBLe4MGD7cwzz7Tjjz/eSpYs6RZJXbNmTbwPK+E9//zzVrNmzeBieQ0bNrRPPvkk3oeVpTzxxBPufdqjR494H0rC69+/v6ur0K1y5crxPqyEt3HjRrv++uvdr17kz5/fatSoYYsWLbJkQ2hCurSoZ61atWz06NHxPpQsY9asWda1a1f7+uuvbfr06XbgwAFr1qyZq0tk7KSTTnIf+osXL3b/E77ooousdevWtmrVqngfWpawcOFCe+GFF1zwhD/VqlWz3377Lbh99dVX8T6khLZ9+3Y799xz3Y8E6wvN6tWrbfjw4Va0aFFLNqzThHRdcsklboN/Wgg11Msvv+xanBQGGjVqFLfjSnRq0Qz12GOPudYnhU99uCFju3fvtg4dOth//vMfe/TRR+N9OFlGSkpKur8pivQNGTLE/d7c+PHjg9dVqFDBkhEtTcBR8ueff7q/xYoVi/ehZBmHDh2yN99807XOqZsOmVPLZqtWraxp06bxPpQsZe3atW7owamnnupC54YNG+J9SAntgw8+cD8vdtVVV7kvgnXq1HFBPRnR0gQcBfqxZ40vUZN29erV4304CW/FihUuJO3du9eOO+44e++996xq1arxPqyEpnC5ZMkS1z0H/xo0aOBagStVquS65gYMGGDnn3++rVy50o1HRFo//vija/3t1auXPfjgg+41d/fdd7sfutfvtSYTQhNwlFoA9D9hxkr4ow+wZcuWuda5t99+2/2PWGPECE7p++WXX6x79+5u7Fy+fPnifThZSuiwA40DU4gqX768TZw40Tp37hzXY0vkL4FqaXr88cfdZbU06f9vY8aMSbrQRPccEGP67cIpU6bY559/7gY548j0jbVixYpWr149NwtRkxBGjRoV78NKWBont3XrVqtbt64bn6NNIfPpp592/1Y3J/wpUqSInXHGGbZu3bp4H0rCKlOmTJovMFWqVEnKbk1amoAY0c843nXXXa5r6YsvvkjagZKx+ma7b9++eB9GwmrSpInr0gx10003uanz999/v+XKlStux5YVB9P/8MMPdsMNN8T7UBKWhhmkXj7l+++/dy10yYbQhAz/RxL6zWv9+vWu+0SDmk8++eS4Hlsid8lNmDDB3n//fTc2YvPmze76woULu3VNkL4+ffq4LhO9rnbt2uXqUKHz008/jfehJSy9vlKPlStYsKBbQ4cxdJm799573YxNfeBv2rTJHnnkERcyr7322ngfWsLq2bOnnXPOOa577uqrr7YFCxbY2LFj3ZZ0AkA6Pv/884BeHqm3Tp06xfvQElZ69aVt/Pjx8T60hHbzzTcHypcvH8iTJ0/ghBNOCDRp0iQwbdq0eB9WlnPBBRcEunfvHu/DSHjXXHNNoEyZMu71duKJJ7rL69ati/dhJbwPP/wwUL169UDevHkDlStXDowdOzaQjHLoP/EObgAAAImOgeAAAAA+EJoAAAB8IDQBAAD4QGgCAADwgdAEAADgA6EJAADAB0ITAACAD4QmAHGXI0cOmzx5siWyn376yR2nVsYXrVquyzt27LBEduONN1qbNm3ifRhAtkBoAnDUPqwVKrTlzp3bSpUqZRdffLGNGzfO/bZcqN9++y3s1+djrX///sFj0U9mlCtXzm699Vb7448/7Gg65ZRTgo9boEABq1Gjhr344osWT40bN7YePXrE9RiArIrQBOCoadGihQtEaqX55JNP7MILL7Tu3bvbpZdeagcPHgyWK126tOXNm/eoHku1atXcseiX2cePH29Tp061O+64w462gQMHusdduXKlXX/99dalSxdXFwCyHkITgKNGQUiB6MQTT7S6devagw8+6H7QWKHh5ZdfzrB77tdff3U/oKofiNYP0davX9/mz58fvF370P7y5ctnp556qg0YMCAshKUnJSUleCxNmza1q666yqZPnx68Xa1fCjgnnXSSO+7atWu7YBWLH9fV4+o477//fndOoY+r7r1bbrnFTjjhBCtUqJBddNFF9s033wRv178VNrUf3V6vXj1btGhRsAVNxxlq5MiRroUro9a/WbNm2ahRo4ItYAq0APwhNAE4phQKatWqZe+++266t+/evdsuuOAC27hxo33wwQcuNNx3333BLr0vv/zSOnbs6FqsVq9ebS+88IILYI899pjvY1BQ+PTTTy1PnjzB6xQkhg8fbk8++aQtX77cmjdvbpdffrmtXbs2Bmf9Tyh75513bPv27WGPq/C2detWFyQXL17swmCTJk2CXYcdOnRwQW7hwoXu9gceeMB1d0ZD59iwYUPX2qXWL23qqgTgT4rPcgAQM5UrV3bBJD0TJkyw33//3YUEtcpIxYoVg7erVUnBoVOnTu6yWnAGDRrkgtUjjzyS4WOuWLHCjjvuODt06JDt3bvXXTdixIjg7QpLaglq3769uzxkyBD7/PPPXcvN6NGjoz5X7fPhhx+2ffv2udYwnZNaluSrr76yBQsWuNDkdU/qONTq9vbbb7txV+pO7N27t6szOf3006M+lsKFC7vApvFVav0CEBlCE4BjLhAIuK6h9Gh2Wp06dYKBKTW1PM2ZMyesZckLQn/99ZcLBOmpVKmSa7lSuddee809zl133eVu27lzp23atMnOPffcsPvocmhXWTQUeNQtplYd/fvOO+8MhkDtWy1rxYsXD7vP33//bT/88IP7d69evVzI+r//+79gt+Jpp532r44JQHQITQCOuW+//dYqVKiQ7m358+fP9L4KGWptateuXZrbNMYpI2ph8cLKE088Ya1atXL7USvV0VSiRAn3uNomTZrkZtBpjFbVqlXduZQpU8YtX5BakSJFguOWrrvuOvvoo49cF55a0958801r27at5cyZ0wXQUAcOHDiq5wMkM8Y0ATimZs6c6brKrrjiinRvr1mzpmsFymg5AI35WbNmTTCIhG4KEX6py0xdYWph0gDrsmXLuhasULqscBMrGj90zTXXWJ8+fYLnsnnzZjdIPfW5KGx5zjjjDOvZs6dNmzbNhUXN/hMNHtf9Q4OTt45UZuFRLXMAIkdoAnDUaByPPtQ1qHvJkiX2+OOPW+vWrd2SAxrMnR7NmtN4Gy3IqNDy448/ugHU8+bNc7f369fPXn31VddKtGrVKtdqpZYXhaBIaEC0ApqOSdR1pnFMb731lgtlGjelAKIB57Gk/X344YduBpy623QcOlcFIg1Qnzt3rj300EPudnXTdevWzbVE/fzzz64+NNarSpUqwTWXNP5r6NChrjtPY6+OtJyBZtZpJqIea9u2bWnWzAKQMUITgKNGU/bV/aQPaq3ZpIHVTz/9tFsyQItMZtQSogBRsmRJa9mypevOUneaV16z2qZMmeLKnHnmmXb22WfbU089ZeXLl4/4+NR6o8Umf/nlF7v77rvd+KF77rnHPaaOXWOg/s3A6/So5apZs2Yu/Glc18cff2yNGjWym266ybUoaSC6ApIWA9U5//e//3UBU7ddffXVbhFQBUZReHruuedcWNKMRA0qv/feezN9fN2u/eo41FKlgeYA/MkRSN0hDgAAgDRoaQIAAPCB0AQAAOADoQkAAMAHQhMAAIAPhCYAAAAfCE0AAAA+EJoAAAB8IDQBAAD4QGgCAADwgdAEAADgA6EJAADAB0ITAACAHdn/A9dyYkm00HexAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import random\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "# 色子的六个面\n",
    "roll = [1, 2, 3, 4, 5, 6]\n",
    "\n",
    "def roll_dice():\n",
    "    return random.choice(roll)  # 随机选择一个数\n",
    "\n",
    "# 模拟掷色子的次数\n",
    "echo = 100000\n",
    "\n",
    "# 使用列表记录每个点数出现的次数\n",
    "results = [roll_dice() for _ in range(echo)]\n",
    "\n",
    "# 绘制直方图\n",
    "plt.hist(results, bins=range(1, 8), align='left', rwidth=0.8, color='blue', edgecolor='black')\n",
    "plt.title('Frequency Distribution of Dice Rolls')\n",
    "plt.xlabel('Dice Roll Result')\n",
    "plt.ylabel('Frequency')\n",
    "plt.xticks(range(1, 7))\n",
    "plt.grid(axis='y', alpha=0.75)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Chi-Square Statistic: 1.2428\n",
      "P-Value: 0.9407059821005829\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "from scipy.stats import chisquare\n",
    "\n",
    "# 计算每个点数出现的频率\n",
    "frequency = [results.count(i) for i in range(1, 7)]\n",
    "\n",
    "# 计算期望频率（均匀分布）\n",
    "expected_frequency = [echo / 6] * 6\n",
    "\n",
    "# 进行卡方检验\n",
    "chi2_stat, p_value = chisquare(frequency, expected_frequency)\n",
    "\n",
    "print(f\"Chi-Square Statistic: {chi2_stat}\")\n",
    "print(f\"P-Value: {p_value}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 182,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['0.9', '0.9', '0.9', '0.6']\n",
      "[[1], [1], [1], [1]]\n"
     ]
    }
   ],
   "source": [
    "import numpy as np\n",
    "import random\n",
    "\n",
    "value = [f\"{random.uniform(0, 1):.1f}\" for _ in range(4)]\n",
    "\n",
    "rewards = [[1] for _ in range(4)]\n",
    "\n",
    "print(value)\n",
    "print(rewards)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 276,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([0.94730107, 0.17870908, 0.73588919, 0.53711242, 0.37016945,\n",
       "        0.75974435, 0.22640835, 0.8557822 , 0.12920501, 0.24714973]),\n",
       " [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]])"
      ]
     },
     "execution_count": 276,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 贪婪算法\n",
    "\"\"\"\n",
    "    贪婪算法：\n",
    "        贪婪算法是选择当前状态下，能够带来较大收益的动作，\n",
    "        即选择当前状态下，能够带来较大收益的动作，\n",
    "        即选择当前状态下，能够带来较大收益的动作。\n",
    "\"\"\"\n",
    "\n",
    "import numpy as np\n",
    "\n",
    "probs = np.random.uniform(size=10) # 输出值接近高斯gessian分布\n",
    "\n",
    "rewards = [[1] for _ in range(10)]\n",
    "\n",
    "probs, rewards"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 373,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 373,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import random\n",
    "\n",
    "def chooose_one():\n",
    "    # 小概率选择一根拉杆\n",
    "    if random.random() < 0.01:\n",
    "        return random.randint(0, 9)\n",
    "\n",
    "    # 计算每个老虎机的奖励平均\n",
    "    rewards_mean = [np.mean(i) for i in rewards]\n",
    "\n",
    "    # 选择期望奖励估值最大的拉杆\n",
    "    return np.argmax(rewards_mean)\n",
    "\n",
    "chooose_one()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 374,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[[1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  1,\n",
       "  0,\n",
       "  1,\n",
       "  0,\n",
       "  1],\n",
       " [1, 0],\n",
       " [1, 0],\n",
       " [1, 1, 1, 1, 0],\n",
       " [1, 0],\n",
       " [1, 1, 0],\n",
       " [1, 1, 0],\n",
       " [1, 1, 1, 0],\n",
       " [1, 0],\n",
       " [1, 0, 0]]"
      ]
     },
     "execution_count": 374,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def try_and_play():\n",
    "    i = chooose_one()\n",
    "    \n",
    "    # 玩老虎机，得到结果\n",
    "    reward = 0\n",
    "    if random.random() < probs[i]:\n",
    "        reward = 1\n",
    "    \n",
    "    # 记录玩的结果\n",
    "    rewards[i].append(reward)\n",
    "\n",
    "try_and_play()\n",
    "\n",
    "rewards"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
